home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / gui4cli / ext / lvformat / indent.h < prev    next >
Text File  |  1999-05-14  |  4KB  |  149 lines

  1.  
  2. // ==============================================================
  3. // Indent the listview - return success
  4. // go through all records, delete old, replace with new..
  5. // gcm   = struct *GCmain
  6. // instr = the string to indent it with
  7. // ==============================================================
  8.  
  9. indentlist (struct GCmain *gcm, UBYTE *instr,
  10.         struct ExecBase *SysBase, struct DosLibrary *DOSBase)
  11. {
  12.     LONG   inlen, totlen;
  13.     struct fulist *fls;
  14.     struct lister *fl, *nextfl;
  15.     UBYTE  *buff;
  16.     
  17.     inlen = strlen(instr);
  18.     
  19.     // get pointer to current listview
  20.     if (!(fls = gcm->curlv) || !fls->ls) return (0);
  21.     
  22.     // do the whole list..
  23.     fl = (struct lister *)(fls->ls->lh_Head);
  24.     while (nextfl = (struct lister *)(fl->node.ln_Succ))
  25.     {
  26.        if (fl->start[0] == '\0') goto skipline; // empty line
  27.  
  28.       // get the buffer we need.. (NOTE totlen + 1 - always!)
  29.        totlen = inlen + fl->length;
  30.        if (!(buff = (UBYTE *)AllocMem(totlen + 1, MEMF_CLEAR)))
  31.        {   PutStr ("No memory!\n");
  32.            return (0);
  33.        }
  34.        // construct the line..
  35.        strcpy (buff, instr);
  36.        strcat (buff, fl->start);
  37.     
  38.        // replace old line
  39.        FreeMem (fl->start, fl->length + 1); // note +1
  40.        fl->start  = buff;   
  41.        fl->length = totlen;
  42.  
  43.        // store max line length
  44.        if (fls->maxlength < fl->length) fls->maxlength = fl->length;
  45.  
  46.        // do next line..
  47.        skipline:
  48.        fl = nextfl;
  49.     }
  50.     return (1); // ok..
  51. }
  52.  
  53. // ==============================================================
  54. // Remove all tabs and spaces from the front of each line
  55. //        of the current listview - return success
  56. // ==============================================================
  57.  
  58. unindentlist (struct GCmain *gcm,
  59.                 struct ExecBase *SysBase, struct DosLibrary *DOSBase)
  60. {
  61.     LONG   len, lead=600, tab, addspace, c;
  62.     struct fulist *fls;
  63.     struct lister *fl, *nextfl;
  64.     UBYTE  *buff, *p, *start;
  65.  
  66.     // get pointer to current listview
  67.     if (!(fls = gcm->curlv) || !fls->ls) return (0);
  68.     tab = gcm->tab; // Gui4Cli tab size
  69.  
  70.     // go through list and find out the smallest indentation
  71.     fl = (struct lister *)(fls->ls->lh_Head);
  72.     while (nextfl = (struct lister *)(fl->node.ln_Succ))
  73.     {
  74.        p = fl->start;
  75.        c = 0;
  76.  
  77.         if (*p) // skip empty lines
  78.         {
  79.           // goto start of letters
  80.           while (*p && ((*p==' ')||(*p=='\t'))) 
  81.             {
  82.                 // enpand tabs
  83.                 if (*p == '\t') c += tab - (c % tab);
  84.                 else ++c;
  85.                 ++p;
  86.             }
  87.           if (lead > c) lead = c;
  88.         }
  89.  
  90.       // do next line..
  91.       fl = nextfl;
  92.    }
  93.  
  94.    if (lead == 0) return (1); // nowhere to go..
  95.  
  96.    // do the whole list..
  97.    fl = (struct lister *)(fls->ls->lh_Head);
  98.    while (nextfl = (struct lister *)(fl->node.ln_Succ))
  99.     {
  100.        if (!(*(fl->start))) goto skipline; // skip empty lines
  101.  
  102.         // set p to start of line, accounting for tabs
  103.         for (p=fl->start, c=0; c < lead; ++p)
  104.         {
  105.             if (*p == ' ') ++c;
  106.             else if (*p == '\t')    c += tab - (c % tab);
  107.         }
  108.  
  109.         len      = strlen(p);    // all this for tabs..
  110.         start    = p;
  111.         addspace = 0;
  112.  
  113.         // adjust if we're in the middle of a tab
  114.         if (c > lead)
  115.         {
  116.             addspace = tab - (c - lead);
  117.             len += addspace;
  118.         }
  119.  
  120.        // get the buffer we need.. (NOTE totlen + 1 - always!)
  121.        if (!(buff = (UBYTE *)AllocMem(len + 1, MEMF_CLEAR)))
  122.        {   PutStr ("No memory!\n");
  123.            return (0);
  124.        }
  125.  
  126.         // fill in spaces (if we were in middle of tab)
  127.         for (c = 0; c < addspace; ++c) buff[c] = ' ';
  128.  
  129.         // copy the line text
  130.        if (*p) strcpy (&buff[addspace], p);
  131.  
  132.        // replace old line
  133.        FreeMem (fl->start, fl->length + 1); // note +1
  134.        fl->start  = buff;
  135.        fl->length = len;
  136.     
  137.        // store max line length
  138.        if (fls->maxlength < fl->length) fls->maxlength = fl->length;
  139.  
  140.        // do next line..
  141.        skipline:
  142.        fl = nextfl;
  143.     }
  144.     return (1); // ok..
  145. }
  146.  
  147.  
  148.  
  149.